{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "<h1> Explore and create ML datasets </h1>\n",
    "\n",
    "In this notebook, we will explore data corresponding to taxi rides in New York City to build a Machine Learning model in support of a fare-estimation tool. The idea is to suggest a likely fare to taxi riders so that they are not surprised, and so that they can protest if the charge is much higher than expected.\n",
    "\n",
    "<div id=\"toc\"></div>\n",
    "\n",
    "Let's start off with the Python imports that we need."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "Nny3m465gKkY"
   },
   "outputs": [],
   "source": [
    "!pip install --upgrade google-cloud-bigquery --quiet\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Note**: Restart your kernel to use updated packages."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Kindly ignore the deprecation warnings and incompatibility errors related to google-cloud-storage."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": true
    }
   },
   "outputs": [],
   "source": [
    "from google.cloud import bigquery\n",
    "import seaborn as sns\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import shutil"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "<h3> Extract sample data from BigQuery </h3>\n",
    "\n",
    "The dataset that we will use is <a href=\"https://bigquery.cloud.google.com/table/nyc-tlc:yellow.trips\">a BigQuery public dataset</a>. Click on the link, and look at the column names. Switch to the Details tab to verify that the number of records is one billion, and then switch to the Preview tab to look at a few rows.\n",
    "\n",
    "Write a SQL query to pick up the following fields\n",
    "<pre>\n",
    "  pickup_datetime,\n",
    "  pickup_longitude, pickup_latitude, \n",
    "  dropoff_longitude, dropoff_latitude,\n",
    "  passenger_count,\n",
    "  trip_distance,\n",
    "  tolls_amount,\n",
    "  fare_amount,\n",
    "  total_amount\n",
    "</pre>\n",
    "from the dataset and explore a random subsample of the data. Sample size should be about 10,000 records. Make sure to pick a repeatable subset of the data so that if someone reruns this notebook, they will get the same results.\n",
    "<p>\n",
    "<b>Hint (highlight to see)</b>\n",
    "<pre style=\"color: white\">\n",
    "Set the query string to be:\n",
    "SELECT above_fields FROM\n",
    "  `nyc-tlc.yellow.trips`\n",
    "WHERE\n",
    "  ABS(MOD(FARM_FINGERPRINT(CAST(pickup_datetime AS STRING)), 100000)) = 1\n",
    "Then, use the BQ library:\n",
    "trips = bigquery.Client().query(query).execute().result().to_dataframe()\n",
    "</pre>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "# TODO: write a BigQuery query for the above fields\n",
    "# Store it into a Pandas dataframe named \"trips\" that contains about 10,000 records.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "<h3> Exploring data </h3>\n",
    "\n",
    "Let's explore this dataset and clean it up as necessary. We'll use the Python Seaborn package to visualize graphs and Pandas to do the slicing and filtering."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fc36358df10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ax = sns.regplot(x = \"trip_distance\", y = \"fare_amount\", ci = None, truncate = True, data = trips)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Hmm ... do you see something wrong with the data that needs addressing?\n",
    "\n",
    "It appears that we have a lot of invalid data that is being coded as zero distance and some fare amounts that are definitely illegitimate. Let's remove them from our analysis. We can do this by modifying the BigQuery query to keep only trips longer than zero miles and fare amounts that are at least the minimum cab fare ($2.50).\n",
    "\n",
    "What's up with the streaks at \\$45 and \\$50?  Those are fixed-amount rides from JFK and La Guardia airports into anywhere in Manhattan, i.e. to be expected. Let's list the data to make sure the values look reasonable.\n",
    "\n",
    "Let's examine whether the toll amount is captured in the total amount."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pickup_datetime</th>\n",
       "      <th>pickup_longitude</th>\n",
       "      <th>pickup_latitude</th>\n",
       "      <th>dropoff_longitude</th>\n",
       "      <th>dropoff_latitude</th>\n",
       "      <th>passenger_count</th>\n",
       "      <th>trip_distance</th>\n",
       "      <th>tolls_amount</th>\n",
       "      <th>fare_amount</th>\n",
       "      <th>total_amount</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2842</th>\n",
       "      <td>2014-05-20 23:09:00</td>\n",
       "      <td>-73.975610</td>\n",
       "      <td>40.751660</td>\n",
       "      <td>-73.953920</td>\n",
       "      <td>40.743240</td>\n",
       "      <td>1</td>\n",
       "      <td>2.22</td>\n",
       "      <td>5.33</td>\n",
       "      <td>8.5</td>\n",
       "      <td>14.83</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4055</th>\n",
       "      <td>2014-05-20 23:09:00</td>\n",
       "      <td>-73.987960</td>\n",
       "      <td>40.754062</td>\n",
       "      <td>-73.956627</td>\n",
       "      <td>40.745962</td>\n",
       "      <td>2</td>\n",
       "      <td>3.11</td>\n",
       "      <td>5.33</td>\n",
       "      <td>11.5</td>\n",
       "      <td>21.30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5045</th>\n",
       "      <td>2014-05-20 23:09:00</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1</td>\n",
       "      <td>6.38</td>\n",
       "      <td>5.33</td>\n",
       "      <td>20.0</td>\n",
       "      <td>26.33</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5145</th>\n",
       "      <td>2014-05-20 23:09:00</td>\n",
       "      <td>-73.873527</td>\n",
       "      <td>40.773922</td>\n",
       "      <td>-73.944947</td>\n",
       "      <td>40.828902</td>\n",
       "      <td>5</td>\n",
       "      <td>8.35</td>\n",
       "      <td>5.33</td>\n",
       "      <td>25.0</td>\n",
       "      <td>36.33</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5249</th>\n",
       "      <td>2014-05-20 23:09:00</td>\n",
       "      <td>-74.005625</td>\n",
       "      <td>40.736770</td>\n",
       "      <td>-73.919840</td>\n",
       "      <td>40.877687</td>\n",
       "      <td>1</td>\n",
       "      <td>14.33</td>\n",
       "      <td>2.44</td>\n",
       "      <td>42.0</td>\n",
       "      <td>54.43</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5300</th>\n",
       "      <td>2014-05-20 23:09:00</td>\n",
       "      <td>-73.783898</td>\n",
       "      <td>40.648660</td>\n",
       "      <td>-73.981845</td>\n",
       "      <td>40.762872</td>\n",
       "      <td>6</td>\n",
       "      <td>18.18</td>\n",
       "      <td>5.33</td>\n",
       "      <td>52.0</td>\n",
       "      <td>69.30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5402</th>\n",
       "      <td>2014-05-20 23:09:00</td>\n",
       "      <td>-73.781987</td>\n",
       "      <td>40.644755</td>\n",
       "      <td>-73.921672</td>\n",
       "      <td>40.828412</td>\n",
       "      <td>1</td>\n",
       "      <td>19.08</td>\n",
       "      <td>5.33</td>\n",
       "      <td>50.5</td>\n",
       "      <td>56.83</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5854</th>\n",
       "      <td>2014-05-20 23:09:00</td>\n",
       "      <td>-73.873210</td>\n",
       "      <td>40.774042</td>\n",
       "      <td>-73.978013</td>\n",
       "      <td>40.755800</td>\n",
       "      <td>5</td>\n",
       "      <td>10.45</td>\n",
       "      <td>5.33</td>\n",
       "      <td>30.5</td>\n",
       "      <td>36.83</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5855</th>\n",
       "      <td>2014-05-20 23:09:00</td>\n",
       "      <td>-73.870160</td>\n",
       "      <td>40.760742</td>\n",
       "      <td>-73.980912</td>\n",
       "      <td>40.788492</td>\n",
       "      <td>4</td>\n",
       "      <td>10.37</td>\n",
       "      <td>5.33</td>\n",
       "      <td>30.5</td>\n",
       "      <td>45.91</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5861</th>\n",
       "      <td>2014-05-20 23:09:00</td>\n",
       "      <td>-73.874445</td>\n",
       "      <td>40.774037</td>\n",
       "      <td>-73.982382</td>\n",
       "      <td>40.784930</td>\n",
       "      <td>1</td>\n",
       "      <td>9.97</td>\n",
       "      <td>5.33</td>\n",
       "      <td>30.5</td>\n",
       "      <td>44.10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5873</th>\n",
       "      <td>2014-05-20 23:09:00</td>\n",
       "      <td>-73.984350</td>\n",
       "      <td>40.761760</td>\n",
       "      <td>-73.859030</td>\n",
       "      <td>40.718510</td>\n",
       "      <td>2</td>\n",
       "      <td>10.04</td>\n",
       "      <td>5.33</td>\n",
       "      <td>31.5</td>\n",
       "      <td>37.83</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5896</th>\n",
       "      <td>2014-05-20 23:09:00</td>\n",
       "      <td>-73.874567</td>\n",
       "      <td>40.774102</td>\n",
       "      <td>-73.986480</td>\n",
       "      <td>40.759202</td>\n",
       "      <td>1</td>\n",
       "      <td>11.43</td>\n",
       "      <td>5.33</td>\n",
       "      <td>37.0</td>\n",
       "      <td>54.04</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5919</th>\n",
       "      <td>2014-05-20 23:09:00</td>\n",
       "      <td>-74.011087</td>\n",
       "      <td>40.724797</td>\n",
       "      <td>-74.026347</td>\n",
       "      <td>40.750997</td>\n",
       "      <td>1</td>\n",
       "      <td>4.09</td>\n",
       "      <td>11.00</td>\n",
       "      <td>45.0</td>\n",
       "      <td>61.00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         pickup_datetime  pickup_longitude  pickup_latitude  \\\n",
       "2842 2014-05-20 23:09:00        -73.975610        40.751660   \n",
       "4055 2014-05-20 23:09:00        -73.987960        40.754062   \n",
       "5045 2014-05-20 23:09:00          0.000000         0.000000   \n",
       "5145 2014-05-20 23:09:00        -73.873527        40.773922   \n",
       "5249 2014-05-20 23:09:00        -74.005625        40.736770   \n",
       "5300 2014-05-20 23:09:00        -73.783898        40.648660   \n",
       "5402 2014-05-20 23:09:00        -73.781987        40.644755   \n",
       "5854 2014-05-20 23:09:00        -73.873210        40.774042   \n",
       "5855 2014-05-20 23:09:00        -73.870160        40.760742   \n",
       "5861 2014-05-20 23:09:00        -73.874445        40.774037   \n",
       "5873 2014-05-20 23:09:00        -73.984350        40.761760   \n",
       "5896 2014-05-20 23:09:00        -73.874567        40.774102   \n",
       "5919 2014-05-20 23:09:00        -74.011087        40.724797   \n",
       "\n",
       "      dropoff_longitude  dropoff_latitude  passenger_count  trip_distance  \\\n",
       "2842         -73.953920         40.743240                1           2.22   \n",
       "4055         -73.956627         40.745962                2           3.11   \n",
       "5045           0.000000          0.000000                1           6.38   \n",
       "5145         -73.944947         40.828902                5           8.35   \n",
       "5249         -73.919840         40.877687                1          14.33   \n",
       "5300         -73.981845         40.762872                6          18.18   \n",
       "5402         -73.921672         40.828412                1          19.08   \n",
       "5854         -73.978013         40.755800                5          10.45   \n",
       "5855         -73.980912         40.788492                4          10.37   \n",
       "5861         -73.982382         40.784930                1           9.97   \n",
       "5873         -73.859030         40.718510                2          10.04   \n",
       "5896         -73.986480         40.759202                1          11.43   \n",
       "5919         -74.026347         40.750997                1           4.09   \n",
       "\n",
       "      tolls_amount  fare_amount  total_amount  \n",
       "2842          5.33          8.5         14.83  \n",
       "4055          5.33         11.5         21.30  \n",
       "5045          5.33         20.0         26.33  \n",
       "5145          5.33         25.0         36.33  \n",
       "5249          2.44         42.0         54.43  \n",
       "5300          5.33         52.0         69.30  \n",
       "5402          5.33         50.5         56.83  \n",
       "5854          5.33         30.5         36.83  \n",
       "5855          5.33         30.5         45.91  \n",
       "5861          5.33         30.5         44.10  \n",
       "5873          5.33         31.5         37.83  \n",
       "5896          5.33         37.0         54.04  \n",
       "5919         11.00         45.0         61.00  "
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tollrides = trips[trips['tolls_amount'] > 0]\n",
    "tollrides[tollrides['pickup_datetime'] == '2014-05-20 23:09:00']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Looking a few samples above, it should be clear that the total amount reflects fare amount, toll and tip somewhat arbitrarily -- this is because when customers pay cash, the tip is not known.  So, we'll use the sum of fare_amount + tolls_amount as what needs to be predicted.  Tips are discretionary and do not have to be included in our fare estimation tool.\n",
    "\n",
    "Let's also look at the distribution of values within the columns."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pickup_longitude</th>\n",
       "      <th>pickup_latitude</th>\n",
       "      <th>dropoff_longitude</th>\n",
       "      <th>dropoff_latitude</th>\n",
       "      <th>passenger_count</th>\n",
       "      <th>trip_distance</th>\n",
       "      <th>tolls_amount</th>\n",
       "      <th>fare_amount</th>\n",
       "      <th>total_amount</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>10789.000000</td>\n",
       "      <td>10789.000000</td>\n",
       "      <td>10789.000000</td>\n",
       "      <td>10789.000000</td>\n",
       "      <td>10789.000000</td>\n",
       "      <td>10789.000000</td>\n",
       "      <td>10789.000000</td>\n",
       "      <td>10789.000000</td>\n",
       "      <td>10789.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>-72.577466</td>\n",
       "      <td>39.988518</td>\n",
       "      <td>-72.577056</td>\n",
       "      <td>39.991694</td>\n",
       "      <td>1.648716</td>\n",
       "      <td>2.837068</td>\n",
       "      <td>0.228359</td>\n",
       "      <td>11.165192</td>\n",
       "      <td>13.280564</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>10.071200</td>\n",
       "      <td>5.523964</td>\n",
       "      <td>10.068592</td>\n",
       "      <td>5.510504</td>\n",
       "      <td>1.282589</td>\n",
       "      <td>3.319036</td>\n",
       "      <td>1.144977</td>\n",
       "      <td>9.444876</td>\n",
       "      <td>11.267704</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>-75.336579</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>-75.381754</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2.500000</td>\n",
       "      <td>2.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>-73.992172</td>\n",
       "      <td>40.735837</td>\n",
       "      <td>-73.991581</td>\n",
       "      <td>40.734267</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.010000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>7.200000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>-73.981871</td>\n",
       "      <td>40.753200</td>\n",
       "      <td>-73.980401</td>\n",
       "      <td>40.752872</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.750000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>8.500000</td>\n",
       "      <td>10.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>-73.967330</td>\n",
       "      <td>40.767309</td>\n",
       "      <td>-73.964102</td>\n",
       "      <td>40.767484</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>3.110000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>12.500000</td>\n",
       "      <td>14.600000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>41.366138</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>41.366138</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>42.800000</td>\n",
       "      <td>16.000000</td>\n",
       "      <td>194.750000</td>\n",
       "      <td>204.750000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       pickup_longitude  pickup_latitude  dropoff_longitude  dropoff_latitude  \\\n",
       "count      10789.000000     10789.000000       10789.000000      10789.000000   \n",
       "mean         -72.577466        39.988518         -72.577056         39.991694   \n",
       "std           10.071200         5.523964          10.068592          5.510504   \n",
       "min          -75.336579         0.000000         -75.381754          0.000000   \n",
       "25%          -73.992172        40.735837         -73.991581         40.734267   \n",
       "50%          -73.981871        40.753200         -73.980401         40.752872   \n",
       "75%          -73.967330        40.767309         -73.964102         40.767484   \n",
       "max            0.000000        41.366138           0.000000         41.366138   \n",
       "\n",
       "       passenger_count  trip_distance  tolls_amount   fare_amount  \\\n",
       "count     10789.000000   10789.000000  10789.000000  10789.000000   \n",
       "mean          1.648716       2.837068      0.228359     11.165192   \n",
       "std           1.282589       3.319036      1.144977      9.444876   \n",
       "min           0.000000       0.000000      0.000000      2.500000   \n",
       "25%           1.000000       1.010000      0.000000      6.000000   \n",
       "50%           1.000000       1.750000      0.000000      8.500000   \n",
       "75%           2.000000       3.110000      0.000000     12.500000   \n",
       "max           6.000000      42.800000     16.000000    194.750000   \n",
       "\n",
       "       total_amount  \n",
       "count  10789.000000  \n",
       "mean      13.280564  \n",
       "std       11.267704  \n",
       "min        2.500000  \n",
       "25%        7.200000  \n",
       "50%       10.000000  \n",
       "75%       14.600000  \n",
       "max      204.750000  "
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trips.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Hmm ... The min, max of longitude look strange.\n",
    "\n",
    "Finally, let's actually look at the start and end of a few of the trips."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fc35be0c450>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def showrides(df, numlines):\n",
    "  import matplotlib.pyplot as plt\n",
    "  lats = []\n",
    "  lons = []\n",
    "  goodrows = df[df['pickup_longitude'] < -70]\n",
    "  for iter, row in goodrows[:numlines].iterrows():\n",
    "    lons.append(row['pickup_longitude'])\n",
    "    lons.append(row['dropoff_longitude'])\n",
    "    lons.append(None)\n",
    "    lats.append(row['pickup_latitude'])\n",
    "    lats.append(row['dropoff_latitude'])\n",
    "    lats.append(None)\n",
    "\n",
    "  sns.set_style(\"darkgrid\")\n",
    "  plt.plot(lons, lats)\n",
    "\n",
    "showrides(trips, 10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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0NDQfn1RREREQ41EENnU2VV2/3BXlniwF+LBXogL+yEeA7LLnYiIiMSPgU5EROQCGOhEREQugIFORETkAhjoRERELoCBTkRE5AIY6ERERC6AgU5EROQCGOhEREQugIFORETkAhjoRERELoCBTkRE5AIY6ERERC6AgU5EROQCGOhEREQugIFORETkAhjoRERELoCBTkRE5AIY6ERERC6AgU5EROQCGOhEREQugIFORETkAhjoRERELoCBTkRE5AIY6ERERC6AgU5EROQCGOhEREQugIFORETkAhjoRERELqBHgZ6ZmYlZs2YhNjYW27Zt63S/2WzGunXrEBMTg6VLl6KkpMR232uvvYaYmBjMnj0bh/FPrVYAAAmHSURBVA4d6rvKiYiIyMZhoFutVmzatAk7duzA/v37kZaWhvz8fLsxKSkp0Gq1OHjwIFauXImkpCQAwLlz5/Dhhx/iwIEDeP311/F///d/EAShf14JERHREOYw0HNzcxESEoKgoCAoFArExcUhIyPDbkxGRgbi4+MBALGxsTh69CgA4JNPPsFDDz0EuVyO4OBghISEIDc3tx9eBhER0dDmMNDLysoQGBhou63X61FeXm43pry8HAaDAQAgk8mgVqthNBq7/NmysrK+qp2IiIiucBjoPdlF3tUYiUTS7b8TERFR35I7GmAwGOwOcisrK0NAQECnMaWlpdDr9bBYLKivr4dWq4XBYMDly5dt40pLSzv97PV0OvXNvgbRcqXXMtixF+LBXogL++E6HM7Qw8PDUVhYiOLiYpjNZqSlpWHmzJl2Y6Kjo5GamgoASE9Px7Rp0wAADzzwAA4cOACz2YyioiIUFhZiypQp/fAyiIiIhjaHM3SZTIYNGzZg1apVEAQBCQkJCA0NxZYtWxAeHo7o6GgsXrwYiYmJiImJgbe3N5KTkwEAY8aMwezZsxEXFwe5XI5f//rX3OVORETUDyQCzyMjIiIa9LhSHBERkQtgoBMREbkABjoREZELYKD3Qm1tLVatWoXY2FisXr0a9fX1XY5LTU1FbGwsYmNjsW/fPtu/79+/H3PnzsX8+fPxox/9CEajcaBKdzm97UVrayt+9atfITY2Fg899BA++uijgSrd5fS2F1f9+Mc/xty5c/u7XJfWm140NzfjiSeewOzZszF37lzbwc50cwb0WigC3bIXX3xR2LZtmyAI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",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fc3601859d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "showrides(tollrides, 10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "As you'd expect, rides that involve a toll are longer than the typical ride."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "<h3> Quality control and other preprocessing </h3>\n",
    "\n",
    "We need to do some clean-up of the data:\n",
    "<ol>\n",
    "<li>New York city longitudes are around -74 and latitudes are around 41.</li>\n",
    "<li>We shouldn't have zero passengers.</li>\n",
    "<li>Clean up the total_amount column to reflect only fare_amount and tolls_amount, and then remove those two columns.</li>\n",
    "<li>Before the ride starts, we'll know the pickup and dropoff locations, but not the trip distance (that depends on the route taken), so remove it from the ML dataset</li>\n",
    "<li>Discard the timestamp</li>\n",
    "</ol>\n",
    "\n",
    "Let's change the BigQuery query appropriately.  In production, we'll have to carry out the same preprocessing on the real-time input data. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "def sample_between(a, b):\n",
    "    basequery = \"\"\"\n",
    "SELECT\n",
    "  (tolls_amount + fare_amount) AS fare_amount,\n",
    "  pickup_longitude AS pickuplon,\n",
    "  pickup_latitude AS pickuplat,\n",
    "  dropoff_longitude AS dropofflon,\n",
    "  dropoff_latitude AS dropofflat,\n",
    "  passenger_count*1.0 AS passengers\n",
    "FROM\n",
    "  `nyc-tlc.yellow.trips`\n",
    "WHERE\n",
    "  trip_distance > 0\n",
    "  AND fare_amount >= 2.5\n",
    "  AND pickup_longitude > -78\n",
    "  AND pickup_longitude < -70\n",
    "  AND dropoff_longitude > -78\n",
    "  AND dropoff_longitude < -70\n",
    "  AND pickup_latitude > 37\n",
    "  AND pickup_latitude < 45\n",
    "  AND dropoff_latitude > 37\n",
    "  AND dropoff_latitude < 45\n",
    "  AND passenger_count > 0\n",
    "  \"\"\"\n",
    "    sampler = \"AND ABS(MOD(FARM_FINGERPRINT(CAST(pickup_datetime AS STRING)), EVERY_N)) = 1\"\n",
    "    sampler2 = \"AND {0} >= {1}\\n AND {0} < {2}\".format(\n",
    "           \"ABS(MOD(FARM_FINGERPRINT(CAST(pickup_datetime AS STRING)), EVERY_N * 100))\",\n",
    "           \"(EVERY_N * {})\".format(a), \"(EVERY_N * {})\".format(b)\n",
    "        )\n",
    "    return \"{}\\n{}\\n{}\".format(basequery, sampler, sampler2)\n",
    "\n",
    "def create_query(phase, EVERY_N):\n",
    "  \"\"\"Phase: train (70%) valid (15%) or test (15%)\"\"\"\n",
    "  query = \"\"\n",
    "  if phase == 'train':\n",
    "    # Training\n",
    "    query = sample_between(0, 70)\n",
    "  elif phase == 'valid':\n",
    "    # Validation\n",
    "    query = sample_between(70, 85)\n",
    "  else:\n",
    "    # Test\n",
    "    query = sample_between(85, 100)\n",
    "  return query.replace(\"EVERY_N\", str(EVERY_N))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "# TODO: try out train, test and valid here\n",
    "print (create_query('train', 100000))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['fare_amount', u'pickuplon', u'pickuplat', u'dropofflon', u'dropofflat', u'passengers', 'key']\n",
      "Wrote 7645 to taxi-train.csv\n",
      "['fare_amount', u'pickuplon', u'pickuplat', u'dropofflon', u'dropofflat', u'passengers', 'key']\n",
      "Wrote 1814 to taxi-valid.csv\n",
      "['fare_amount', u'pickuplon', u'pickuplat', u'dropofflon', u'dropofflat', u'passengers', 'key']\n",
      "Wrote 1017 to taxi-test.csv\n"
     ]
    }
   ],
   "source": [
    "def to_csv(df, filename):\n",
    "  outdf = df.copy(deep = False)\n",
    "  outdf.loc[:, 'key'] = np.arange(0, len(outdf)) # rownumber as key\n",
    "  # Reorder columns so that target is first column\n",
    "  cols = outdf.columns.tolist()\n",
    "  cols.remove('fare_amount')\n",
    "  cols.insert(0, 'fare_amount')\n",
    "  print (cols)  # new order of columns\n",
    "  outdf = outdf[cols]\n",
    "  outdf.to_csv(filename, header = False, index_label = False, index = False)\n",
    "  print (\"Wrote {} to {}\".format(len(outdf), filename))\n",
    "\n",
    "for phase in ['train', 'valid', 'test']:\n",
    "  query = create_query(phase, 100000)\n",
    "  df = bigquery.Client().query(query).to_dataframe()\n",
    "  to_csv(df, 'taxi-{}.csv'.format(phase))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "<h3> Verify that datasets exist </h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-rw-r--r-- 1 root root  56326 Aug 30 21:32 taxi-test.csv\n",
      "-rw-r--r-- 1 root root 425723 Aug 30 21:32 taxi-train.csv\n",
      "-rw-r--r-- 1 root root 100355 Aug 30 21:32 taxi-valid.csv\n"
     ]
    }
   ],
   "source": [
    "!ls -l *.csv"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "We have 3 .csv files corresponding to train, valid, test.  The ratio of file-sizes correspond to our split of the data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.5,-73.988954,40.758612,-73.952118,40.776227,2.0,0\n",
      "2.5,-73.971783,40.763727,-73.971769,40.763768,2.0,1\n",
      "3.0,-73.976258,40.786085,-73.974417,40.788517,2.0,2\n",
      "3.0,-73.990085,40.746602,-73.993129,40.74765,2.0,3\n",
      "3.5,-73.981335,40.781372,-73.981517,40.78386,2.0,4\n",
      "3.5,-73.982673,40.727202,-73.978255,40.729524,2.0,5\n",
      "3.5,-73.98582,40.744768,-73.978803,40.752505,2.0,6\n",
      "3.5,-73.984404,40.767969,-73.988457,40.764324,2.0,7\n",
      "3.5,-73.961372,40.769257,-73.966002,40.768292,2.0,8\n",
      "3.5,-73.992835,40.768267,-73.93862,40.788212,2.0,9\n"
     ]
    }
   ],
   "source": [
    "!head taxi-train.csv"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Looks good! We now have our ML datasets and are ready to train ML models, validate them and evaluate them."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "<h3> Benchmark </h3>\n",
    "\n",
    "Before we start building complex ML models, it is a good idea to come up with a very simple model and use that as a benchmark.\n",
    "\n",
    "My model is going to be to simply divide the mean fare_amount by the mean trip_distance to come up with a rate and use that to predict.  Let's compute the RMSE of such a model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Rate = $2.61647175325/km\n",
      "Train RMSE = 7.45944982351\n",
      "Valid RMSE = 9.35408256465\n",
      "Test RMSE = 5.44470804972\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python2.7/dist-packages/ipykernel/__main__.py:8: RuntimeWarning: invalid value encountered in arccos\n"
     ]
    }
   ],
   "source": [
    "from google.cloud import bigquery\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import shutil\n",
    "\n",
    "def distance_between(lat1, lon1, lat2, lon2):\n",
    "  # Haversine formula to compute distance \"as the crow flies\".  Taxis can't fly of course.\n",
    "  dist = np.degrees(np.arccos(np.sin(np.radians(lat1)) * np.sin(np.radians(lat2)) + np.cos(np.radians(lat1)) * np.cos(np.radians(lat2)) * np.cos(np.radians(lon2 - lon1)))) * 60 * 1.515 * 1.609344\n",
    "  return dist\n",
    "\n",
    "def estimate_distance(df):\n",
    "  return distance_between(df['pickuplat'], df['pickuplon'], df['dropofflat'], df['dropofflon'])\n",
    "\n",
    "def compute_rmse(actual, predicted):\n",
    "  return np.sqrt(np.mean((actual - predicted)**2))\n",
    "\n",
    "def print_rmse(df, rate, name):\n",
    "  print (\"{1} RMSE = {0}\".format(compute_rmse(df['fare_amount'], rate * estimate_distance(df)), name))\n",
    "\n",
    "FEATURES = ['pickuplon','pickuplat','dropofflon','dropofflat','passengers']\n",
    "TARGET = 'fare_amount'\n",
    "columns = list([TARGET])\n",
    "columns.extend(FEATURES) # in CSV, target is the first column, after the features\n",
    "columns.append('key')\n",
    "df_train = pd.read_csv('taxi-train.csv', header = None, names = columns)\n",
    "df_valid = pd.read_csv('taxi-valid.csv', header = None, names = columns)\n",
    "df_test = pd.read_csv('taxi-test.csv', header = None, names = columns)\n",
    "rate = df_train['fare_amount'].mean() / estimate_distance(df_train).mean()\n",
    "print (\"Rate = ${0}/km\".format(rate))\n",
    "print_rmse(df_train, rate, 'Train')\n",
    "print_rmse(df_valid, rate, 'Valid') \n",
    "print_rmse(df_test, rate, 'Test') "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "The simple distance-based rule gives us a RMSE of <b>$9.35</b> on the validation dataset.  We have to beat this, of course, but you will find that simple rules of thumb like this can be surprisingly difficult to beat. You don't wnat to set a goal on the test dataset because you want to change the architecture of the network etc. to get the best validation error. Then, you can evaluate ONCE on the test data."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## Challenge Exercise\n",
    "\n",
    "Let's say that you want to predict whether a Stackoverflow question will be acceptably answered. Using this [public dataset of questions](https://bigquery.cloud.google.com/table/bigquery-public-data:stackoverflow.posts_questions), create a machine learning dataset that you can use for classification.\n",
    "<p>\n",
    "What is a reasonable benchmark for this problem?\n",
    "What features might be useful?\n",
    "<p>\n",
    "If you got the above easily, try this harder problem: you want to predict whether a question will be acceptably answered within 2 days. How would you create the dataset?\n",
    "<p>\n",
    "Hint (highlight to see):\n",
    "<p style='color:white' linkstyle='color:white'> \n",
    "You will need to do a SQL join with the table of [answers]( https://bigquery.cloud.google.com/table/bigquery-public-data:stackoverflow.posts_answers) to determine whether the answer was within 2 days.\n",
    "</p>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Copyright 2018 Google Inc.\n",
    "Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n",
    "http://www.apache.org/licenses/LICENSE-2.0\n",
    "Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
